"use strict";

/**
 * 校验是否为手机号
 *
 * @since 0.0.2
 * @category 正则
 * @param {string|number} str 需要校验的字符串.
 * @param {object} config 配置参数.
 * @param {boolean} config.isDetail 是否返回详细信息, 为true时返回CheckResult, false时返回boolean 默认: false.
 * @param {boolean} config.isStrict 是否严格校验有效号码段, 默认: false.
 * @param {boolean} config.isVirtual 是否包含虚拟号码段, 默认: true.
 *
 * @returns { boolean|CheckResult } 校验结果 或 结果对象.
 *
 * @typedef {object} CheckResult
 * @property {boolean} status 校验结果
 * @property {string} errorMsg 错误提示
 * @property {RexExp} reg 校验数据使用的RexExp对象
 *
 * @example
 *
 * z.isMobile('13112345678')
 * // => true
 *
 * z.isMobile('13112345678', { isDetail: true })
 * // { status: true, errorMsg: '', reg: /^1[3-9]\d{9}$/ }
 *
 */
function isMobile(str) {
  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
      _ref$isDetail = _ref.isDetail,
      isDetail = _ref$isDetail === void 0 ? false : _ref$isDetail,
      _ref$isStrict = _ref.isStrict,
      isStrict = _ref$isStrict === void 0 ? false : _ref$isStrict,
      _ref$isVirtual = _ref.isVirtual,
      isVirtual = _ref$isVirtual === void 0 ? true : _ref$isVirtual;

  var rt = {
    status: false,
    errorMsg: ''
  };
  if (typeof str === 'number') str = "".concat(str);
  var reg = '';
  if (!isStrict && isVirtual) reg = '^1[3-9]\\d{9}$';
  if (!isStrict && !isVirtual) reg = '^(1[3-5]\\d|1[8-9]\\d|16[^257]|17[^01])\\d{8}$';
  if (isStrict && isVirtual) reg = '^(13\\d|14[^1-4|8]|15[^4]|16[2|5-7]|17[^4|9]|18\\d|19[^0|2|4])\\d{8}$';
  if (isStrict && !isVirtual) reg = '^(13\\d|14[^1-4|8]|15[^4]|166|17[^0|1|4|9]|18\\d|19[^0|2|4])\\d{8}$';
  rt.reg = new RegExp(reg);

  if (reg && !rt.reg.test(str)) {
    rt.errorMsg = '格式错误!';
  } else {
    rt.status = true;
  }

  return isDetail ? rt : rt.status;
}

module.exports = isMobile;